/**
 * 
 */
package ec.edu.uce.erp.ejb.servicio.impl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ec.edu.uce.erp.common.util.ConstantesApplication;
import ec.edu.uce.erp.common.util.EncriptacionUtil;
import ec.edu.uce.erp.common.util.MessagesApplicacion;
import ec.edu.uce.erp.common.util.SeguridadesException;
import ec.edu.uce.erp.common.util.UtilAplication;
import ec.edu.uce.erp.ejb.persistence.dao.FactoryDAO;
import ec.edu.uce.erp.ejb.persistence.entities.CompaniaDTO;
import ec.edu.uce.erp.ejb.persistence.entities.ModuloDTO;
import ec.edu.uce.erp.ejb.persistence.entities.PerfilDTO;
import ec.edu.uce.erp.ejb.persistence.entities.UsuarioDTO;
import ec.edu.uce.erp.ejb.servicio.ServicioAdministracion;

/**
 * @author wilmerPC
 *
 */
@Stateless
public class ServicioAdministracionImpl implements ServicioAdministracion{
	
	private static final Logger slf4jLogger = LoggerFactory.getLogger(ServicioAdministracionImpl.class);
	
	@EJB 
	private FactoryDAO factoryDAO;

	@Override
	public CompaniaDTO registrarCompania(CompaniaDTO companiaDTO) throws SeguridadesException {
		try {
			
			slf4jLogger.info("registrarCompania");
			
			if (companiaRepetida(companiaDTO)) {
				throw new SeguridadesException("Ya se encuentra registrada una compania con ese nombre");
			}
			
			if (StringUtils.isEmpty(companiaDTO.getEstado())) {
				companiaDTO.setEstado(ConstantesApplication.ESTADO_ACTIVO);
			}
			companiaDTO.setFechaRegistro(UtilAplication.obtenerFechaActual());
			return factoryDAO.getCompaniaDAOImpl().create(companiaDTO);
			
		} catch (Exception e) {
			slf4jLogger.info("Error al registrar la compania {}", e.getMessage());
			throw new SeguridadesException("No se pudo registrar la compania");
		}
	}
	
	private Boolean companiaRepetida (CompaniaDTO companiaDTO) throws SeguridadesException {
		
		CompaniaDTO companiaPlantilla = new CompaniaDTO();
		companiaPlantilla.setNombreCompania(companiaDTO.getNombreCompania());
		
		List<CompaniaDTO> dtos = factoryDAO.getCompaniaDAOImpl().obtenerCompaniaCriterios(companiaPlantilla);
		
		if (CollectionUtils.isEmpty(dtos)) {
			return Boolean.FALSE;
		} 
		
		return Boolean.TRUE;
	}

	@Override
	public CompaniaDTO actualizarCompania(CompaniaDTO companiaDTO) throws SeguridadesException {
		try {
			
			slf4jLogger.info("actualizarCompania");
			companiaDTO.setFechaModificacion(UtilAplication.obtenerFechaActual());
			return factoryDAO.getCompaniaDAOImpl().update(companiaDTO);
			
		} catch (Exception e) {
			throw new SeguridadesException("No se pudo actualizar la compania");
		}
	}

	@Override
	public List<CompaniaDTO> buscarCompania(CompaniaDTO companiaDTO) throws SeguridadesException {
		try {
			slf4jLogger.info("buscarCompania");
			return factoryDAO.getCompaniaDAOImpl().obtenerCompaniaCriterios(companiaDTO);
		} catch (Exception e) {
			throw new SeguridadesException("No se pudo obtener las companias de la base de datos");
		}
	}

	@Override
	public ModuloDTO registrarModulo(ModuloDTO moduloDTO) throws SeguridadesException {
		
		try {
			slf4jLogger.info("registrarModulo");
			moduloDTO.setFechaRegistro(UtilAplication.obtenerFechaActual());
			return factoryDAO.getModuloDAOImpl().create(moduloDTO);
			
		} catch (Exception e) {
			slf4jLogger.info("Error al registrar la compania {}", e.getMessage());
			throw new SeguridadesException("No se pudo registrar el m\u00F3dulo");
		}
	}

	@Override
	public List<PerfilDTO> buscarPerfiles(PerfilDTO perfilDTO) throws SeguridadesException {
		try {
			slf4jLogger.info("buscarPerfiles");
			return factoryDAO.getPerfilDAOImpl().obtenerPerfilCriterios(perfilDTO);
		} catch (Exception e) {
			throw new SeguridadesException("No se pudo obtener los perfiles de la base de datos");
		}
	}

	@Override
	public UsuarioDTO registrarUsuario(UsuarioDTO usuarioDTO) throws SeguridadesException {
		try {
			slf4jLogger.info("registrarUsuario");
			usuarioDTO.setFechaRegistro(UtilAplication.obtenerFechaActual());
			usuarioDTO.setPassUsuario(EncriptacionUtil.getInstancia().encriptar(MessagesApplicacion.getString("erp.seguridades.clave.usuario.default")));
			usuarioDTO.setEstado(ConstantesApplication.ESTADO_ACTIVO);
			return factoryDAO.getUsuarioDAOImpl().create(usuarioDTO);
			
		} catch (Exception e) {
			slf4jLogger.info("Error al registrar el usuario {}", e.getMessage());
			throw new SeguridadesException("No se pudo registrar el usuario");
		}
	}

}
